
from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split
from sklearn.cluster import KMeans

import matplotlib.pyplot as plt
import numpy as np

# 引入iris鸢尾花数据,iris数据包含4个特征变量
iris = datasets.load_iris()
iris_X = iris.data  # 特征变量
iris_y = iris.target  # 目标值
# 将数据集划分为20%测试集和80%训练集
X_train, X_test, Y_train, Y_test = train_test_split(iris_X, iris_y,
                                                    test_size=0.2)

num = int(input("请输入聚类的个数K:"))
kmeans = KMeans(n_clusters=num, random_state=None).fit(X_train)
print(kmeans.labels_)
print("样本的聚类中心")
print(kmeans.cluster_centers_)
print("测试集分类结果")
print(kmeans.predict(X_test))

# 通过PCA算法进行数据降维,可以2维显示
reduced_data = PCA(n_components=2).fit_transform(iris_X)
kmeans = KMeans(init="k-means++", n_clusters=num)
kmeans.fit(reduced_data)

# 网格的步长。 降低以提高 VQ 的质量。
h = .02  # 网格中的点 [x_min, x_max]x[y_min, y_max]。

# 绘制上下限边界。
x_min, x_max = reduced_data[:, 0].min() - 1, reduced_data[:, 0].max() + 1
y_min, y_max = reduced_data[:, 1].min() - 1, reduced_data[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))

# 获取网格中每个点的标签。 使用最后训练的模型。
Z = kmeans.predict(np.c_[xx.ravel(), yy.ravel()])

# 将结果放入彩色图中
Z = Z.reshape(xx.shape)
plt.figure(1)
plt.clf()
plt.imshow(Z, interpolation="nearest",
           extent=(xx.min(), xx.max(), yy.min(), yy.max()),
           cmap=plt.cm.Paired, aspect="auto", origin="lower")

plt.plot(reduced_data[:, 0], reduced_data[:, 1], 'k.', markersize=2)
# 将质心绘制为白色 X
centroids = kmeans.cluster_centers_
plt.scatter(centroids[:, 0], centroids[:, 1], marker="x", s=169, linewidths=3,
            color="w", zorder=10)
plt.title("K-means clustering on the digits dataset (PCA-reduced data)\n"
          "Centroids are marked with white cross")
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.xticks(())
plt.yticks(())
plt.show()
